#include "Motor.H"

/**
    ******************************************************************************
    * @brief  配置电机驱动引脚和PWM输出
    * @param  无
    * @retval 无
    * @note   控制引脚: 
    *         - PC1: 电机方向控制1
    *         - PC2: 电机方向控制2
    *         - PA1: PWM输出 (TIM2_CH2)
    ******************************************************************************
*/
void Motor_Config(void)
{
    // 使能GPIOC时钟，用于控制电机方向
    RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE);
    
    // 配置PC1和PC2为推挽输出模式，控制电机方向
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Mode = GPIO_Mode_Out_PP,     // 推挽输出模式
        .GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2,  // 选择PC1和PC2
        .GPIO_Speed = GPIO_Speed_50MHz,   // 引脚速度50MHz
    };
    GPIO_Init(MOTOR_PORT, &GPIO_InitStructure);
    
    // 初始化PWM输出，用于控制电机转速
    // 频率: 20kHz，占空比范围: 0-99
    PWM_Config();
}

/**
    ******************************************************************************
    * @brief  设置电机转速和方向
    * @param  Speed: 电机速度值
    *         - 正值: 正转，绝对值越大转速越高
    *         - 负值: 反转，绝对值越大转速越高
    *         - 范围: -99 至 +99
    * @retval 无
    * @note   通过控制PC1和PC2的电平组合实现方向控制
    *         通过PWM占空比控制转速
    ******************************************************************************
*/
void Motor_SetSpeed(u8 Speed)
{
    if (Speed >= 0) {
        // 正转控制
        GPIO_SetBits(MOTOR_PORT, MOTOR_PIN1);    // PC1 = HIGH
        GPIO_ResetBits(MOTOR_PORT, MOTOR_PIN2);  // PC2 = LOW
        PWM_SetCompare2(Speed);             // 设置PWM占空比
    }
    else {
        // 反转控制
        GPIO_ResetBits(MOTOR_PORT, MOTOR_PIN1);  // PC1 = LOW
        GPIO_SetBits(MOTOR_PORT, MOTOR_PIN2);    // PC2 = HIGH
        PWM_SetCompare2(-Speed);            // 使用Speed的绝对值作为占空比
    }
}
